package Day_0210.DesignPattern;

/**
 * @author zxc
 * @date 2023/02/11 12:23
 **/
public class Observer_Pattern {
    public static void main(String[] args) {
        /**
         * 谈一谈对于观察者模式的理解
         * ===》
         * 1.观察者模式
         * ===》
         * （1）定义对象间的一种 一对多依赖关系，使得每当一个对象状态发生改变时，其相关依赖对象皆得到通知并被自动更新。
         * （2）观察者模式，又叫做发布-订阅（Publish/Subscribe）模式、模型-视图（Model/View）模式、源-监听器（Source/Listener）模式或从属者（Dependents）模式。
         *
         * 2.优点：
         * （1）观察者模式可以实现表示层和数据逻辑层的分离，并定义了稳定的消息更新传递机制，抽象了更新接口，使得可以有各种各样不同的表示层作为具体观察者角色；
         * （2）观察者模式在观察目标和观察者之间建立一个抽象的耦合；
         * （3）观察者模式支持广播通信；
         * （4）观察者模式符合开闭原则（对拓展开放，对修改关闭）的要求。
         *
         * 3.缺点：
         * （1）如果一个观察目标对象有很多直接和间接的观察者的话，将所有的观察者都通知到会花费很多时间；
         * （2）如果在观察者和观察目标之间有循环依赖的话，观察目标会触发它们之间进行循环调用，可能导致系统崩溃；
         * （3）观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的，而仅仅只是知道观察目标发生了变化。
         *
         * 4.在观察者模式中，有如下角色：
         * （1）Subject：抽象主题（抽象被观察者）
         *  抽象主题角色把所有观察者对象保存在一个集合里，每个主题都可以有任意数量的观察者，抽象主题提供一个接口，可以增加和删除观察者对象；
         *
         * （2）ConcreteSubject：具体主题（具体被观察者）
         *  该角色将有关状态存入具体观察者对象，在具体主题的内部状态发生改变时，给所有注册过的观察者发送通知；
         *
         * （3）Observer：抽象观察者
         *  是观察者者的抽象类，它定义了一个更新接口，使得在得到主题更改通知时更新自己；
         *
         * （4）ConcrereObserver：具体观察者
         *  实现抽象观察者定义的更新接口，以便在得到主题更改通知时更新自身的状态。
         *
         * 注意 ：在Spring中大量的使用的观察者模式，只要看到是以Event结尾或者Publish开头的基本上都是观察者模式。
         *
         */
    }
}
